home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 4 / FM Towns Free Software Collection 4 - Disc 1.iso / t_os / wink / source / oak.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-10-19  |  6.8 KB  |  336 lines

  1. #include    <stdio.h>
  2. #include    <ctype.h>
  3. #include    "defs.h"
  4. #include    "oaklib.h"
  5.  
  6. #define    MAX_MAC    512
  7.  
  8. extern char    *Act_vram();
  9. extern void    wrtstr();
  10. extern void    memcpy();
  11. extern void    memset();
  12. extern int    strlen();
  13. extern void    locate();
  14. extern void    Dsp_box_vram();
  15. extern char    *SPCSTR;
  16.  
  17. short  ReWrt_flg=FALSE;
  18.  
  19. static struct _MACRO {
  20.        int      mc_ch;
  21.        unsigned mc_ec;
  22.     } mac_key[MAX_MAC+1];
  23. static int    mac_cnt=0;
  24. static int    mac_max=0;
  25. static int    mac_flg=0;
  26.  
  27. static int       ch_bak;
  28. static unsigned ec_bak;
  29. static int       hit_flg=FALSE;
  30.  
  31. void    putmode(int md,int sf,char *str)
  32. {
  33.     wrtstr(str,71,MENU_Y,0x1F);
  34. }
  35. void    putsys(int len,char *str,char *att)
  36. {
  37.     int     n,Bak_X,Bak_Y;
  38.     char    *vp;
  39.     static int     Bak_len=0;
  40.     static char    *Bak_vp=NULL;
  41.     static char    Bak_vram[160];
  42.  
  43.     Bak_X = Cur_X; Bak_Y = Cur_Y;
  44.     Cur_X = 0 ; Cur_Y = MENU_Y-OFF_Y;
  45.  
  46.     if ( Bak_len > 0 )
  47.     memcpy(Bak_vp,Bak_vram,Bak_len * 2);
  48.  
  49.     Bak_vp = Act_vram();
  50.     memcpy(Bak_vram,Bak_vp,len * 2);
  51.  
  52.     n = len;
  53.     vp = Bak_vp;
  54.     while ( n-- > 0 ) {
  55.     *(vp++) = (*(att++) & 0x0F) | 0x38;
  56.     if ( iskanji((UCHAR)*str) ) {
  57.         *(vp-1) |= 0x40;
  58.         *(vp++) = *(str++);
  59.         *(vp++) = (*(att++) & 0x0F) | 0x80;
  60.         *(vp++) = *(str++);
  61.         n--;
  62.     } else
  63.         *(vp++) = *(str++);
  64.     }
  65.  
  66.     Dsp_box_vram((Bak_len > len ? Bak_len : len),0x07);
  67.  
  68.     Bak_len = len;
  69.     Cur_X = Bak_X; Cur_Y = Bak_Y;
  70. }
  71. void    putstr(int pos,int len,char *str,char *att)
  72. {
  73.     int     n;
  74.     char    *vp;
  75.     static int     Bak_len=0;
  76.     static char    *Bak_vp=NULL;
  77.     static char    Bak_vram[160];
  78.  
  79.     if ( Bak_len > 0 )
  80.     memcpy(Bak_vp,Bak_vram,Bak_len * 2);
  81.  
  82.     Bak_vp = Act_vram();
  83.     memcpy(Bak_vram,Bak_vp,len * 2 + 2);
  84.  
  85.     vp = Bak_vp;
  86.     for ( n = 0 ; n < len ; n++ ) {
  87.     *(vp++) = (*(att++) & 0x0F) | (n == pos ? 0x30 : 0x38);
  88.     if ( iskanji((UCHAR)*str) ) {
  89.         *(vp-1) |= 0x40;
  90.         *(vp++) = *(str++);
  91.         *(vp++) = (*(att++) & 0x0F) | 0x80;
  92.         *(vp++) = *(str++);
  93.         n++;
  94.     } else
  95.         *(vp++) = *(str++);
  96.     }
  97.     if ( len > 0 && n == pos ) {
  98.     *vp |= 0x17;
  99.     len++;
  100.     }
  101.  
  102.     Dsp_box_vram((Bak_len > len ? Bak_len : len),0x07);
  103.     Bak_len = len;
  104. }
  105. void    Ent_sub(sw)
  106. int    sw;
  107. {
  108.     char     bk,*vp;
  109.  
  110.     vp = (char *)Act_vram();
  111.     if ( sw == FALSE ) {
  112.     *vp &= 0xDF;
  113.         Dsp_box_vram(1,0x07);
  114.     } else {
  115.     bk = *vp;
  116.     *vp = (*vp & 0xC0) | 0x3C;
  117.         Dsp_box_vram(1,0x07);
  118.     *vp = bk;
  119.     }
  120. }
  121. void    Ent_tango(arg)
  122. char    *arg;
  123. {
  124.     int     i,j,ch,sc;
  125.     unsigned ec;
  126.     int     Ent_X,Ent_Y;
  127.     int     Bak_X,Bak_Y;
  128.     char    *vp,*Ent_vp,*End_vp;
  129.     char    att[80];
  130.  
  131.     Bak_X = Cur_X; Bak_Y = Cur_Y;
  132.     Ent_sub(TRUE);
  133.     *arg = '\0';
  134.  
  135.     memset(att,0x00,10);
  136.     memset(att + 10,0x01,53);
  137.     putsys(63,
  138.            "単語登録  登録位置にカ-ソルを移動して実行キ-を押してください ",
  139.        att);
  140.  
  141.     for ( ; ; ) {
  142.     ch = KAN_read(0,&ec); sc = (ec >> 8) & 0xFF;
  143.     Ent_sub(FALSE);
  144.     if ( sc == 0x4F ) {
  145.         if ( --Cur_X < 0 )
  146.             Cur_X = MAX_X - 1;
  147.             vp = (char *)Act_vram();
  148.         if ( (*vp & 0x80) != 0 && Cur_X > 0 )
  149.         Cur_X--; 
  150.     } else if ( sc == 0x51 && ++Cur_X >= MAX_X )
  151.         Cur_X = 0;
  152.     else if ( sc == 0x4D && --Cur_Y < 0 )
  153.         Cur_Y = MENU_Y - 3;
  154.     else if ( sc == 0x50 && ++Cur_Y > (MENU_Y - 3) )
  155.         Cur_Y = 0;
  156.     else if ( sc == 0x72 )
  157.         goto ENDOF;
  158.     else if ( sc == 0x73 )
  159.         break;
  160.         vp = (char *)Act_vram();
  161.     if ( (*vp & 0x80) != 0 && Cur_X < (MAX_X - 1) )
  162.         Cur_X++;
  163.     Ent_sub(TRUE);
  164.     }
  165.  
  166.     Ent_X = Cur_X; Ent_Y = Cur_Y; 
  167.     Ent_vp = (char *)Act_vram();
  168.  
  169.     putsys(36,
  170.            "単語登録  登録範囲を指定してください",
  171.        att);
  172.  
  173.     Cur_X = Ent_X ; Cur_Y = Ent_Y;
  174.  
  175.     for ( ; ; ) {
  176.     ch = KAN_read(0,&ec); sc = (ec >> 8) & 0xFF;
  177.     if ( sc == 0x4F ) {
  178.         vp = (char *)Act_vram();
  179.         if ( vp > Ent_vp ) {
  180.         if ( --Cur_X < 0 ) {
  181.             Cur_X = MAX_X - 1;
  182.             if ( Cur_Y > 0 )
  183.             Cur_Y--;
  184.         }
  185.         vp = (char *)Act_vram();
  186.         if ( Cur_X > 0 && (*vp & 0x80) != 0 )
  187.             Cur_X--;
  188.         Ent_sub(FALSE);
  189.         }
  190.     } else if ( sc == 0x51 ) {
  191.         Ent_sub(TRUE);
  192.         vp = (char *)Act_vram();
  193.         if ( (*vp & 0x40) != 0 && (*(vp+2) & 0x80) != 0 )
  194.         Cur_X += 2;
  195.         else
  196.         Cur_X++;
  197.         if ( Cur_X >= MAX_X ) {
  198.         Cur_X -= MAX_X;
  199.         if ( ++Cur_Y > (MENU_Y - 3) )
  200.             Cur_Y = MENU_Y - 3;
  201.         }
  202.     } else if ( sc == 0x72 )
  203.         goto CLROF;
  204.     else if ( sc == 0x73 )
  205.         break;
  206.     }
  207.     End_vp = (char *)Act_vram();
  208.     for ( vp = Ent_vp ; vp < End_vp ; vp+=2 ) {
  209.     if ( (unsigned char)(*(arg++) = *(vp+1)) < ' ' )
  210.         *(arg-1) = ' ';
  211.     }
  212.     *arg = '\0';
  213. CLROF:
  214.     i = Cur_X; j = Cur_Y;
  215.     Cur_X = Ent_X; Cur_Y = Ent_Y;
  216.     for ( ; ; ) {
  217.     Ent_sub(FALSE);
  218.     vp = (char *)Act_vram();
  219.     if ( (*vp & 0x40) != 0 && (*(vp+2) & 0x80) != 0 )
  220.         Cur_X += 2;
  221.     else
  222.         Cur_X++;
  223.     if ( Cur_X >= MAX_X ) {
  224.         Cur_X -= MAX_X;
  225.         if ( ++Cur_Y > (MENU_Y - 3) )
  226.         Cur_Y = MENU_Y - 3;
  227.     }
  228.     if ( Cur_Y >= j && Cur_X >= i )
  229.         break;
  230.     }
  231. ENDOF:
  232.     Cur_X = Bak_X; Cur_Y = Bak_Y;
  233.     locate();
  234. }
  235. void    Tango_Touroku()
  236. {
  237.     int     len;
  238.     char    tmp[160];
  239.  
  240.     Ent_tango(tmp);
  241.     if ( (len = strlen(tmp)) > 0 )
  242.     KAN_touroku(len,tmp);
  243.     putsys(0,"","");
  244. }
  245. /******************* Debug Code *******************
  246. void    deb_dsp(ch,ec)
  247. int    ch,ec;
  248. {
  249.     char tmp[40];
  250.  
  251.     sprintf(tmp,"CH=%04X EC=%04X",ch,ec);
  252.     wrtstr(tmp,0,0,0x1F);
  253. }
  254. ****************************************************/
  255.  
  256. void    mac_save()
  257. {
  258.     switch(mac_flg) {
  259.     case 0: case 2:
  260.     mac_flg = 1;
  261.     mac_max = 0;
  262.     wrtstr("只今キ-マクロを定義中です",30,1,0x15);
  263.     break;
  264.     case 1:
  265.     mac_flg = 2;
  266.     mac_cnt = 0;
  267.     mac_max--;
  268.     wrtstr(SPCSTR,30,1,0x1F);
  269.     break;
  270.     }
  271. }
  272. void    mac_go()
  273. {
  274.     if ( mac_flg == 2 ) {
  275.     mac_flg = 3;
  276.     mac_cnt = 0;
  277.     }
  278. }
  279. int    kbhit()
  280. {
  281.     if ( hit_flg != FALSE )
  282.     return 1;
  283.  
  284.     if ( mac_flg == 3 ) {
  285.     if ( mac_cnt < mac_max ) {
  286.         hit_flg = TRUE;
  287.         ch_bak = mac_key[mac_cnt].mc_ch;
  288.         ec_bak = mac_key[mac_cnt].mc_ec;
  289.         mac_cnt++;
  290.         return 1;
  291.     } else {
  292.         mac_flg = 2;
  293.         mac_cnt = 0;
  294.     }
  295.     }
  296.  
  297.     while ( (ch_bak = KAN_read(1,&ec_bak)) != 0xFFFF ) {
  298.     if ( ch_bak & 0x8000 || (ec_bak & 0xFF00) > 0x5100 )
  299.         ch_bak = 0xFFFF;
  300.     switch(ec_bak & 0xFF00) {
  301.     case 0xFF00:
  302.         break;
  303.  
  304.     case 0x6D00:
  305.         Tango_Touroku();
  306.         break;
  307.  
  308.     default:
  309.         hit_flg = TRUE;
  310.         if ( mac_flg == 1 && mac_max < MAX_MAC ) {
  311.         mac_key[mac_max].mc_ch = ch_bak;
  312.         mac_key[mac_max].mc_ec = ec_bak;
  313.         mac_max++;
  314.         }
  315.         return 1;
  316.     }
  317.     }
  318.     return 0;
  319. }
  320. int    Get_key(ec)
  321. unsigned *ec;
  322. {
  323.     while ( kbhit() == 0 );
  324.     hit_flg = FALSE;
  325.     *ec = ec_bak & 0xFF14;
  326.     return ch_bak;
  327. }
  328. int    getch()
  329. {
  330.     int       ch;
  331.     unsigned  ec;
  332.  
  333.     while ( (ch = Get_key(&ec)) == 0xFFFF );
  334.     return ch;
  335. }
  336.